Use case: ICACHE maintenance operations in polling mode

This use case shows how to configure ICACHE and run maintenance operations (invalidate) in polling mode.

Sequence diagram

    @startuml

    skinparam sequenceMessageAlign center

    participant "User\nApplication" as UA
    participant "ICACHE\nDriver" as ID

    group Loop [Can be repeated]

    group Optional
    UA->ID : **HAL_ICACHE_ConfigAssociativityMode**
    ID --> UA : return HAL_OK
    UA->ID : **HAL_ICACHE_Monitor_Start**
    ID --> UA : return HAL_OK
    |||
    end
    UA->ID : **HAL_ICACHE_Enable**
    ID --> UA : return HAL_OK

    group Loop [Can be repeated]
    UA->ID : **HAL_ICACHE_Invalidate**
    ID --> UA : return HAL_OK, HAL_BUSY, HAL_ERROR, HAL_TIMEOUT
    |||
    end
    group Optional
    UA->ID : **HAL_ICACHE_Monitor_GetHitValue**, **HAL_ICACHE_Monitor_GetMissValue**
    ID --> UA : Monitor's value
    UA->ID : **HAL_ICACHE_Monitor_Reset**
    ID --> UA : return HAL_OK
    end
    UA->ID : **HAL_ICACHE_Disable**
    ID --> UA : return HAL_OK
    end
    UA->ID : **HAL_ICACHE_DeInit**
    ID --> UA

    @enduml

Code snippet

HAL1

HAL2

/* Configure ICACHE (optional) */
HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY);

/* Enable monitors (optional) */
HAL_ICACHE_Monitor_Start();

/* Enable ICACHE */
HAL_ICACHE_Enable();

/* Maintenance operation (polling) */
if (HAL_ICACHE_Invalidate() != HAL_OK)
{
  Error_Handler();
}

/* Read/Reset monitors (optional) */
(void)HAL_ICACHE_Monitor_GetHitValue();
(void)HAL_ICACHE_Monitor_GetMissValue();
HAL_ICACHE_Monitor_Reset();

/* Stop ICACHE */
HAL_ICACHE_Disable();
HAL_ICACHE_DeInit();
hal_icache_handle_t hicache1;

/* Init triggers a HW invalidate */
if (HAL_ICACHE_Init(&hicache1, HAL_ICACHE1) != HAL_OK)
{
  Error_Handler();
}

/* Optional configuration */
(void)HAL_ICACHE_SetAssociativityMode(&hicache1, HAL_ICACHE_ASSOCIATIVITY_1WAY);
(void)HAL_ICACHE_EnableMonitors(&hicache1);

/* Start ICACHE */
if (HAL_ICACHE_Start(&hicache1, HAL_ICACHE_IT_NONE) != HAL_OK)
{
  Error_Handler();
}

/* Maintenance operation (polling) */
if (HAL_ICACHE_Invalidate(&hicache1) != HAL_OK)
{
  Error_Handler();
}

/* Optional monitors */
(void)HAL_ICACHE_GetMonitorHitValue(&hicache1);
(void)HAL_ICACHE_GetMonitorMissValue(&hicache1);
(void)HAL_ICACHE_ResetMonitors(&hicache1);

/* Stop ICACHE */
(void)HAL_ICACHE_Stop(&hicache1);
(void)HAL_ICACHE_DeInit(&hicache1);

Key changes

  1. HAL2 uses an explicit handle-based init/start/stop flow (HAL_ICACHE_Init(), HAL_ICACHE_Start(), HAL_ICACHE_Stop()), replacing the HAL1 enable/disable approach.

  2. Monitor and configuration APIs are renamed and handle-based in HAL2 (HAL_ICACHE_EnableMonitors(), HAL_ICACHE_GetMonitor*(), HAL_ICACHE_ResetMonitors()).

  3. HAL2 may automatically invalidate the cache during initialization (hardware invalidate on HAL_ICACHE_Init()).